#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// C语言常用的预处理命令：宏定义、文件包含、条件编译等，预处理命令都以 # 开头
// 预处理指令是在编译之前执行的，在预处理阶段由预处理器进行处理
// 预处理命令通常位于程序的顶部，但它们可以出现在程序的任何位置，如下文代码所示

#define MAX(x, y) (x)>(y)?(x):(y)
#define MAX2(x, y, z) z = x > y ? x : y
#define POWER(x) (x)*(x)
#define CONVERSE

void func() {
    int a=5, b=2, c=3, d=3, t;
    t = MAX(a+b, c+d)*10;
    printf("t = %d\n", t);

    int x=5, y=1, z;
    MAX2(x+y, x, z); // z = x + y > x ? x + y : x
    printf("z = %d\n", z);

    int i = 1;
    while (i <= 4) {
        printf("%d ", POWER(i++));
    }
    printf("\n");
}

void test() {
    char c;
    if ((c = getchar()) != '\n') {
        test();
    }
    putchar(c);
}

void conditional_compile() {
    #if defined(NULL)
        printf("NULL = %d\n", NULL);
    #else 
        printf("NULL未定义！\n");
    #endif

    #ifndef PI
    #define PI 3.14
    #endif
    int r = 10;
    printf("%d\n", PI*POWER(r));
    printf("%f\n", PI*POWER(r));

    char str[50], *p = str;
    scanf("%s", str);
    #undef CONVERSE // #undef 用于取消对宏CONVERSE的定义（终止了宏定义的作用域）
    #ifdef CONVERSE // 逆序打印
        p = p + strlen(str) - 1;
        while (*p != '\0') {
            printf("%c", *p);
            --p;
        }
        printf("\n");
    #else 
        printf("%s\n", str);
    #endif
}

int main() {
    func();
    // test();
    conditional_compile();
    return 0;
}
